//package com.roncoo.education.oauth.config;
// 
//import java.util.ArrayList;
//import java.util.List;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.security.authentication.AuthenticationManager;
//import org.springframework.security.core.userdetails.UserDetailsService;
//import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
//import org.springframework.security.crypto.password.PasswordEncoder;
//import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
//import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
//import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
//import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
//import org.springframework.security.oauth2.provider.ClientDetailsService;
//import org.springframework.security.oauth2.provider.token.TokenEnhancer;
//import org.springframework.security.oauth2.provider.token.TokenEnhancerChain;
//import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
// 
///**
// * @author 千城丶Y
// * @className : AuthorizationServerConfig
// * @PACKAGE_NAME : com.bjpowenrode.oauth.config
// * @date : 2022/9/21 18:28
// * @Description TODO 授权服务器配置
// */
////@Configuration
////@EnableAuthorizationServer // 启用授权服务器
//public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
//    /**
//     * 注入自定义扩展器
//     */
//	@Autowired
//    private CustomerTokenEnhancer tokenEnhancer;
//    @Autowired
//    private JwtAccessTokenConverter jwtAccessTokenConverter;
//    @Autowired
//    private ClientDetailsServiceImpl clientDetailsService;    
//
////    @Autowired
////    private TokenStore tokenStore;
//    
//    private final PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
//    private final UserDetailsService userDetailsService;
//    /**
//     * 注入进来 认证管理器
//     */
//    private final AuthenticationManager authenticationManager ;
// 
//    public AuthorizationServerConfig(UserDetailsService userDetailsService, AuthenticationManager authenticationManager) {
//        this.userDetailsService = userDetailsService;
//        this.authenticationManager = authenticationManager;
//    }
// 
//    /**
//     *  对授权客户端的配置
//     *
//     *  用来配置授权服务器可以为哪些客户端授权 // id secret redirectURI 使用那种授权模式
//     *
//     *  {
//     *     "access_token": "becac041-faf4-4b2d-8c58-8b10a38f290f",
//     *     "token_type": "bearer",
//     *     "refresh_token": "4752515d-f528-4932-a255-d20cdb5e95c4",
//     *     "expires_in": 43199,
//     *     "scope": "read:user"
//     * }
//     * */
//    @Override
//    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
//    	clients.withClientDetails(clientDetailsService);
////            clients
////                    .inMemory() // 表示基于内存
////                    .withClient("clientId" ) // 设置客户端编号
////                    .secret(passwordEncoder.encode("secret")) // 设置客户端密钥 ,这里官方规定secret必现加密 可以使用 passwordEncode
////                    .redirectUris("http://www.baidu.com") // 重定向URI
////                    // authorization_code 授权码   refresh_token 刷新令牌  implicit 简化模式   password 密码模式  client_credentials 客户端模式
////                    // 暂不支持简化模式, 因为需要解析一段脚本来获取令牌
////                    .authorizedGrantTypes("authorization_code","refresh_token","implicit","password","client_credentials") // 表示使用那种授权模式 可以设置支持多种，授权码模式
////                    .scopes("read:user");// 令牌允许获取资源权限
//    }
// 
//    // 授权码这种模式：
//    // 1.请求用户是否授权 /oauth/authorize
//    // 完整路径 : http://localhost:8080/oauth/authorize?client_id=clientId&response_type=code&redirect_uri=http://www.baidu.com
//    // 2.授权之后根据获取的授权码获取令牌 /oauth/token 参数 ： client_id secret redirect_uri code
//    // 完整路径 :curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'grant_type=authorization_code&code=2qewq&redirect_uri=http://www.baidu.com' "http://client:secret@localhost:8080/oauth/token"
// 
//    // 3.支持令牌刷新 /oauth/token 参数 id secret 授权类型 :refresh_token 刷新的令牌:refresh_token
//    // 完整路径  :curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'grant_type=refresh_token&refresh_token=2qewq&redirect_uri=http://www.baidu.com' "http://client:secret@localhost:8080/oauth/token"
// 
//    /**
//     * 开启刷新令牌功能  实现刷新令牌必现指定userDetailsService ，有了它，刷新令牌时就不需要在获取授权码了 刷新令牌和  获取令牌的路径是一样的 参数多了
//     */
//    @Override
//    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
//        endpoints.userDetailsService(userDetailsService); // 开启刷新令牌必现指定
//        endpoints.authenticationManager(authenticationManager); // 密码模式需要注入 authenticationManager
//        
////        endpoints.tokenStore(tokenStore);
////        endpoints.accessTokenConverter(jwtAccessTokenConverter);
//        
//        TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
//        List<TokenEnhancer> list = new ArrayList<>();
//        list.add(tokenEnhancer);
//        list.add(jwtAccessTokenConverter);
//        tokenEnhancerChain.setTokenEnhancers(list);
//        endpoints.tokenEnhancer(tokenEnhancerChain);
//    }
//}
